package puc.redes.examples.server;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class TCPThreadHandler implements Runnable {

	Socket m_connection = null;
	ObjectOutputStream out;
	ObjectInputStream in;
	String message;

	int m_clientID = -1;
	boolean m_bRunThread = true;

	TCPThreadHandler(Socket s, int clientID) {
		m_connection = s;
		m_clientID = clientID;
		System.out.println("server, client id is: " + m_clientID);
	}

	// En el constructor recibe y guarda los par�metros que sean necesarios.
	// En este caso una lista con toda la conversaci�n y el socket que debe
	// atender.
	@Override
	public void run() {
		try {

			System.out.println("Conexion recibida "
					+ m_connection.getInetAddress().getHostName());

			// 3. obtener los stream de entrada y salida
			out = new ObjectOutputStream(m_connection.getOutputStream());
			out.flush();
			in = new ObjectInputStream(m_connection.getInputStream());
			sendMessage("Conexion exitosa");

			// 4. Las dos partes se comunican a través de los stream de datos
			do {
				try {
					message = (String) in.readObject();
					System.out.println("cliente: " + message);
					if(message.equals("hola servidor")) {
						sendMessage("envio de datos");
					}
					if(message.equals("fin recepcion datos")){
						sendMessage("ok");
					}
					
				} catch (ClassNotFoundException classnot) {
					System.err
							.println("Datos recibidos en formato desconocido");
				}
			} while (!message.equals("chau"));
		} catch (IOException ioException) {
			ioException.printStackTrace();
		} finally {
			// 4: cierre de la conexión
			try {
				in.close();
				out.close();
				m_connection.close();
			} catch (IOException ioException) {
				ioException.printStackTrace();
			}
		}
	}

	void sendMessage(String msg) {
		try {
			out.writeObject(msg);
			out.flush();
			System.out.println("server: " + msg);
		} catch (IOException ioException) {
			ioException.printStackTrace();
		}
	}

}
